package negocio;

import java.io.Serializable;
import java.util.ArrayList;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import exceptions.MesaException;

import beans.MesaVO;
import beans.PedidoVO;
import beans.SalonVO;
import beans.SectorVO;

@Entity
@Table(name="salones")
public class Salon implements Serializable 
{
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_salon", nullable=false)
	private int id_salon;
	
	
	@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name="id_salon", referencedColumnName="id_salon")
	private List<Sector> sectores= new ArrayList<>() ;
	
	@Column(name="capacidadMaximaDeCubiertos")
	private int capacidadMaximaCubiertos;
		
	public List<Sector> getSectores() {
		return sectores;
	}
	public void setSectores(List<Sector> sectores) {
		this.sectores = sectores;
	}
	public int getCapacidadMaximaCubiertos() {
		return capacidadMaximaCubiertos;
	}
	public void setCapacidadMaximaCubiertos(int capacidadMaximaCubiertos) {
		this.capacidadMaximaCubiertos = capacidadMaximaCubiertos;
	}
	public int getId_salon() {
		return id_salon;
	}
	public void setId_salon(int id_salon) {
		this.id_salon = id_salon;
	}
	
	public SalonVO getVO()
	{
		SalonVO salonVO = new SalonVO();
		salonVO.setCapacidadMaximaCubiertos(getCapacidadMaximaCubiertos());
		ArrayList<SectorVO> sectoresVO = new ArrayList<SectorVO>();
		for (int i = 0 ; i < getSectores().size() ; i++)
		{
			SectorVO sectorVO = new SectorVO();
			sectorVO.setId_sector(getSectores().get(i).getId_sector());
			ArrayList<MesaVO> mesasVO = new ArrayList<MesaVO>();
			for (int j = 0 ; j < getSectores().get(i).getMesas().size() ; j++)
			{
				Mesa mesa = getSectores().get(i).getMesas().get(j);
				MesaVO mesaVO = new MesaVO();
				mesaVO.setId_numeroMesas(mesa.getId_numeroMesas());
				mesaVO.setCant_personas(mesa.getCant_personas());
				mesaVO.setEstado(mesa.getEstado());
				mesaVO.setFecha_de_apertura(mesa.getFecha_de_apertura());
				mesaVO.setFecha_de_liberacion(mesa.getFecha_de_apertura());
				mesaVO.setMaxCant_Personas(mesa.getMaxCant_Personas());
				mesaVO.setNumeroMesa(mesa.getNumeroMesa());
				ArrayList<PedidoVO> pedidosVO = new ArrayList<PedidoVO>();
				for (int k = 0 ; k < mesa.getPedidos().size() ; k++)
				{
					PedidoVO pedVO = mesa.getPedidos().get(i).getVO();
					pedidosVO.add(pedVO);
				}
				mesaVO.setPedidos(pedidosVO);
				mesaVO.setTiempo_de_Permanencia(mesa.getTiempo_de_Permanencia());
				mesasVO.add(mesaVO);
			}
			
			sectorVO.setMesas(mesasVO);
			sectorVO.setNombre(getSectores().get(i).getNombre());
			sectoresVO.add(sectorVO);
		}
		salonVO.setSectores(sectoresVO);
		
		return salonVO;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + capacidadMaximaCubiertos;
		result = prime * result + id_salon;
		result = prime * result
				+ ((sectores == null) ? 0 : sectores.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Salon other = (Salon) obj;
		if (capacidadMaximaCubiertos != other.capacidadMaximaCubiertos)
			return false;
		if (id_salon != other.id_salon)
			return false;
		if (sectores == null) {
			if (other.sectores != null)
				return false;
		} else if (!sectores.equals(other.sectores))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Salon [id_salon=" + id_salon + ", sectores=" + sectores
				+ ", capacidadMaximaCubiertos=" + capacidadMaximaCubiertos
				+ "]";
	}
	public Mesa getMesa(int numeroMesa) throws MesaException {
		for(Sector s : sectores){
			for(Mesa m : s.getMesas()){
				if(m.getNumeroMesa() == numeroMesa)
					return m;
			}
		}
		throw new MesaException("No se encontro la mesa.");
	}
}
